package options

import (
	"gitee.com/han-jiahao666/iam/internal/pkg/server"
	"github.com/spf13/pflag"
)

// ServerRunOptions 包含运行通用 API 服务器时的选项。
type ServerRunOptions struct {
	Mode        string   `json:"mode"        mapstructure:"mode"`        // 服务器运行模式
	Healthz     bool     `json:"healthz"     mapstructure:"healthz"`     // 是否启用健康检查
	Middlewares []string `json:"middlewares" mapstructure:"middlewares"` // 服务器允许使用的中间件列表
}

// NewServerRunOptions 创建一个带有默认参数的新 ServerRunOptions 对象。
func NewServerRunOptions() *ServerRunOptions {
	// 获取服务器的默认配置
	defaults := server.NewConfig()

	return &ServerRunOptions{
		Mode:        defaults.Mode,        // 使用默认的服务器运行模式
		Healthz:     defaults.Healthz,     // 使用默认的健康检查设置
		Middlewares: defaults.Middlewares, // 使用默认的中间件列表
	}
}

// ApplyTo 将运行选项应用到方法接收者，并返回自身。
func (s *ServerRunOptions) ApplyTo(c *server.Config) error {
	// 将当前 ServerRunOptions 的 Mode 赋值给服务器配置的 Mode
	c.Mode = s.Mode
	// 将当前 ServerRunOptions 的 Healthz 赋值给服务器配置的 Healthz
	c.Healthz = s.Healthz
	// 将当前 ServerRunOptions 的 Middlewares 赋值给服务器配置的 Middlewares
	c.Middlewares = s.Middlewares

	return nil
}

// Validate 检查 ServerRunOptions 的有效性。
func (s *ServerRunOptions) Validate() []error {
	// 用于存储验证过程中出现的错误
	errors := []error{}

	return errors
}

// AddFlags 为特定的 APIServer 向指定的 FlagSet 中添加标志。
func (s *ServerRunOptions) AddFlags(fs *pflag.FlagSet) {
	// 注意：下面行中的奇怪的 ""+ 似乎是让 gofmt 合理排列这些文本块的唯一方法。真烦人。
	fs.StringVar(&s.Mode, "server.mode", s.Mode, ""+
		"以指定的服务器模式启动服务器。支持的服务器模式：debug, test, release。")

	fs.BoolVar(&s.Healthz, "server.healthz", s.Healthz, ""+
		"添加自身就绪检查并安装 /healthz 路由。")

	fs.StringSliceVar(&s.Middlewares, "server.middlewares", s.Middlewares, ""+
		"服务器允许使用的中间件列表，以逗号分隔。如果此列表为空，则使用默认中间件。")
}
